package gestores;


import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import componentes.Competencia;
import componentes.Encuentro;

import componentes.HistorialResultado;
import componentes.HistorialResultadoFinal;
import componentes.HistorialResultadoPuntuacion;
import componentes.HistorialResultadoSets;

import componentes.ListaCambiosPart;
import componentes.LugarDeRealizacion;
import componentes.Participante;
import componentes.Resultado;
import componentes.ResultadoFinal;
import componentes.ResultadoPuntos;
import componentes.ResultadoSets;
import dao.DAO_Competencia;
import dao.DAO_Encuentros;


public class GestorEncuentro {
	private static GestorEncuentro INSTANCE = null;
	/**
     * constructor
     */
    private GestorEncuentro() {
	}
    
     /**
     *  Metodo para obtener una instancia, si existe la devuelve, sino la crea
     * @return instancia si existe
     */
    public static GestorEncuentro getInstance(){
 		if (INSTANCE == null) { 
            INSTANCE = new GestorEncuentro();
        }
 		return INSTANCE;
    }


	public Encuentro generarEncuentro(Participante part1,Participante part2, int fecha, int nroEncuentro,LugarDeRealizacion lugar , String puntuacion) {
		 //para probar se pone el resultado en null, TODO: falta ver de instanciar eso;
		Resultado resultado = null;		
		Encuentro encuentro = null;
		List<HistorialResultado> historial= new ArrayList<>();
		
		if(puntuacion.equals("Puntuacion")){
			resultado = new ResultadoPuntos();
			historial.add(new HistorialResultadoPuntuacion());
		}
		else if(puntuacion.equals("Sets")){
			resultado = new ResultadoSets();
			historial.add(new HistorialResultadoSets());
		}
		else if(puntuacion.equals("Resultado Final")){
			resultado = new ResultadoFinal();
			historial.add(new HistorialResultadoFinal());
			
		} 
		
		encuentro = new Encuentro(part1, part2, lugar, fecha, nroEncuentro, "0");
		 
		encuentro.setResultado(resultado);
		resultado.setHistorial(historial);
		
		return encuentro;
		
		
	}
	
	
	//Metodo que dado el nombre de una competencia obtiene todos los id encuentro que no esten eliminados
	public List<String> getIdEncuentros(String nombreCompetencia) throws SQLException {
		// TODO Auto-generated method stub
		ResultSet aux;
		List<String> listaIdEncuentros = new ArrayList<String>();
		
		
		aux = DAO_Encuentros.getInstance().getIdEncuentros(nombreCompetencia);
		
		while(aux.next()){
			listaIdEncuentros.add(aux.getString("id_encuentro"));
		}
		
		return listaIdEncuentros;
		
		
		
	}


	public Encuentro getEncuentroBD(String puntuacion ,String id_encuentro) throws SQLException {
		// TODO Auto-generated method stub
		Encuentro encuentro = null;
		ResultSet auxEncuentro;
		Participante part1;
		Participante part2;
		LugarDeRealizacion lugar;
		Resultado resultado;
		ArrayList<ListaCambiosPart> listaCambiosPart1;
		ArrayList<ListaCambiosPart> listaCambiosPart2;
			
		
		if(this.esPart1Libre(id_encuentro)){
			part1 = new Participante("Libre", " ", " ");
		}
		else{
			part1 = GestorParticipante.getInstance().getParticipante1Encuentro(id_encuentro);
		}
		
		
		if(this.esPart2Libre(id_encuentro)){
			part2 = new Participante("Libre", " ", " ");
		}
		else{
			part2 = GestorParticipante.getInstance().getParticipante2Encuentro(id_encuentro);
		}
	
			
		lugar = GestorLugares.getInstance().getLugarEncuentro(id_encuentro);
		
		
		auxEncuentro = DAO_Encuentros.getInstance().getDatosEncuentro(id_encuentro);
		auxEncuentro.next();
		
		
		encuentro = new Encuentro(part1, part2, lugar, auxEncuentro.getInt("fecha"), auxEncuentro.getInt("numero_encuentro"), auxEncuentro.getString("jugado"));
		
	
		
		encuentro.setAsistioPart1(auxEncuentro.getString("asistio_part1"));
		encuentro.setAsistioPart2(auxEncuentro.getString("asistio_part2"));
		
		listaCambiosPart1 = GestorParticipante.getInstance().getListaCambiosPart1(id_encuentro);
		listaCambiosPart2 = GestorParticipante.getInstance().getListaCambiosPart2(id_encuentro);

		
		encuentro.getPart1().setCambios(listaCambiosPart1);
		encuentro.getPart2().setCambios(listaCambiosPart2);
		
		
		
		resultado = this.getResultadoEncuentroBD(puntuacion, id_encuentro);
		encuentro.setResultado(resultado);
		
		
		return encuentro;
		
	}
	
	
	

	private Resultado getResultadoEncuentroBD(String puntuacion, String id_encuentro) throws SQLException {
		// TODO Auto-generated method stub
		
		Resultado resultado = null;
		ResultSet aux;
		List<HistorialResultado> listaHistorial = null;
		
		aux = DAO_Encuentros.getInstance().getResultadoEncuentro(id_encuentro);
		aux.next();
		
		if(puntuacion.equals("Puntuacion")){
			resultado = new ResultadoPuntos();
			resultado.setPuntosPart1(aux.getInt("puntuacion_part1"));
			resultado.setPuntosPart2(aux.getInt("puntuacion_part2"));
			
		}
		
		else if(puntuacion.equals("Sets")){
			resultado = new ResultadoSets();
			int[] part1 = new int[9];
			for(int i=0;i<9; i++){
				part1[i]=aux.getInt("set_"+(i+1)+"_part1");
			}
			
			int[] part2 = new int[9];
			for(int i=0;i<9; i++){
				part2[i]=aux.getInt("set_"+(i+1)+"_part2");
			}
			
			resultado.setSetsParticipante1(part1);
			resultado.setSetsParticipante2(part2);
		}
		
		else if(puntuacion.equals("Resultado Final")){
			resultado = new ResultadoFinal();
			
			if(aux.getString("ganador_part1").equals("-1") && aux.getString("perdedor_part1").equals("-1")  &&
					aux.getString("ganador_part2").equals("-1")	&& aux.getString("perdedor_part2").equals("-1")){
				//No se cargo ningun resultado
				resultado.setGanador("-1");
				resultado.setPerdedor("-1");
			}
			else{
				if(aux.getString("ganador_part1").equals("1") && aux.getString("perdedor_part1").equals("0")  &&
						aux.getString("ganador_part2").equals("0")	&& aux.getString("perdedor_part2").equals("1")){
				//Gano el participante 1	
					resultado.setGanador("Participante 1");
					resultado.setPerdedor("Participante 2");
				
				}
				else{ //el ganador es el participante 2
					resultado.setGanador("Participante 2");
					resultado.setPerdedor("Participante 1");
				}
			}
		}
		
		
		listaHistorial = this.getHistorialEncuentroBD(puntuacion, id_encuentro);
		resultado.setHistorial(listaHistorial);
		
		
		
		return resultado;

	}

	
	

	private List<HistorialResultado> getHistorialEncuentroBD(String puntuacion, String id_encuentro) throws SQLException {
		// TODO Auto-generated method stub
		
		ResultSet aux;
		List<HistorialResultado> historial = null;
		HistorialResultadoPuntuacion historialResultadoPuntuacion = null; 
		HistorialResultadoFinal historialResultadoFinal = null;
		HistorialResultadoSets historialResultadoSets = null;
		
		aux = DAO_Encuentros.getInstance().getHistorialEncuentro(id_encuentro);
		
		while(aux.next()){
			
			if(puntuacion.equals("Puntuacion")){
				historialResultadoPuntuacion = new HistorialResultadoPuntuacion();
				
				historialResultadoPuntuacion.setFecha(historialResultadoPuntuacion.getFechaActual());
				historialResultadoPuntuacion.setPuntosPart1(aux.getInt("puntosPart1"));
				historialResultadoPuntuacion.setPuntosPart2(aux.getInt("puntosPart2"));
				
				historial.add(historialResultadoPuntuacion);
				
			}
			
			else if(puntuacion.equals("Sets")){
				historialResultadoSets = new HistorialResultadoSets();
				
				
				int[] part1 = new int[9];
				for(int i=0;i<9; i++){
					part1[i]=aux.getInt("set_"+(i+1)+"_part1");
				}
				
				int[] part2 = new int[9];
				for(int i=0;i<9; i++){
					part2[i]=aux.getInt("set_"+(i+1)+"_part2");
				}
				
				//se arma arriba
				
				historialResultadoSets.setFecha(historialResultadoSets.getFechaActual());
				historialResultadoSets.setParticipante1(part1);
				historialResultadoSets.setParticipante2(part2);
				
				
				
				historial.add(historialResultadoPuntuacion);
				
			}
			
			else if(puntuacion.equals("Resultado Final")){
				historialResultadoFinal = new HistorialResultadoFinal();
				historialResultadoFinal.setFecha(historialResultadoFinal.getFechaActual());
				
		
				if(aux.getString("ganador_part1").equals("-1") && aux.getString("perdedor_part1").equals("-1")  &&
						aux.getString("ganador_part2").equals("-1")	&& aux.getString("perdedor_part2").equals("-1")){
					//No se cargo ningun resultado
					historialResultadoFinal.setGanador("-1");
					historialResultadoFinal.setPerdedor("-1");
				}
				else{
					if(aux.getString("ganador_part1").equals("1") && aux.getString("perdedor_part1").equals("0")  &&
							aux.getString("ganador_part2").equals("0")	&& aux.getString("perdedor_part2").equals("1")){
					//Gano el participante 1	
						historialResultadoFinal.setGanador("Participante 1");
						historialResultadoFinal.setPerdedor("Participante 2");
					
					}
					else{ //el ganador es el participante 2
						historialResultadoFinal.setGanador("Participante 2");
						historialResultadoFinal.setPerdedor("Participante 1");
					}
				}
			
			
			
		
				
				historial.add(historialResultadoPuntuacion);
				
				
			}
			
			
		}
		
		
		
		
		
		
	
		
		return historial;
	}
	
	
	
	
	
	
	
	
	
	public boolean esPart1Libre(String id_encuentro) throws SQLException{
		ResultSet aux;
		boolean bandera =  false;
		
		aux = DAO_Encuentros.getInstance().esPart1Libre(id_encuentro);
		
		if(aux.next()){
			bandera = true;
		}
		
		return bandera;
	}
	
	
	public boolean esPart2Libre(String id_encuentro) throws SQLException{
		ResultSet aux;
		boolean bandera =  false;
		
		aux = DAO_Encuentros.getInstance().esPart2Libre(id_encuentro);
		
		if(aux.next()){
			bandera = true;
		}
		
		return bandera;
	}

	public void guardarResultado(Encuentro encuentro, Competencia competencia) throws SQLException {
		String id_competencia = GestorCompetencia.getInstance().getIdCompetencia(competencia.getNombre());
		
		DAO_Encuentros.getInstance().actualizarEstado("1", encuentro.getnEncuentro(), encuentro.getFecha(), id_competencia);
		
		if(isUltimoEncuentro(competencia)){
			DAO_Competencia.getInstance().actualizarEstado(competencia.getNombre(), "Finalizada");
			System.out.println("seteo a finalizada");
		}
		else{
			DAO_Competencia.getInstance().actualizarEstado(competencia.getNombre(), "En Disputa");
		}
		if(competencia.getModalidad().getPuntuacion().getTipoPuntuacion().equals("Resultado Final")){
			if(encuentro.getResultado().getGanador().equals("Participante 1")){
				DAO_Competencia.getInstance().actualizarResultadoFinalPart1(encuentro.getFecha(), encuentro.getnEncuentro(), "1", "0", competencia.getNombre());
				DAO_Competencia.getInstance().actualizarResultadoFinalPart2(encuentro.getFecha(), encuentro.getnEncuentro(), "0", "1", competencia.getNombre());
			}
			if(encuentro.getResultado().getGanador().equals("Participante 1")){
				DAO_Competencia.getInstance().actualizarResultadoFinalPart1(encuentro.getFecha(), encuentro.getnEncuentro(), "0", "1", competencia.getNombre());
				DAO_Competencia.getInstance().actualizarResultadoFinalPart2(encuentro.getFecha(), encuentro.getnEncuentro(), "1", "0", competencia.getNombre());
			}
		}
		if(competencia.getModalidad().getPuntuacion().getTipoPuntuacion().equals("Puntuacion")){
			DAO_Competencia.getInstance().actualizarResultadoPuntuacionPart1(encuentro.getFecha(), encuentro.getnEncuentro(), encuentro.getResultado().getPuntosPart1(), competencia.getNombre());
			DAO_Competencia.getInstance().actualizarResultadoPuntuacionPart2(encuentro.getFecha(), encuentro.getnEncuentro(), encuentro.getResultado().getPuntosPart2(), competencia.getNombre());
		}
		if(competencia.getModalidad().getPuntuacion().getTipoPuntuacion().equals("Sets")){
			DAO_Competencia.getInstance().actualizarResultadoSetsPart1(encuentro.getFecha(), encuentro.getnEncuentro(), encuentro.getResultado().getSetsParticipante1(), competencia.getNombre());
			DAO_Competencia.getInstance().actualizarResultadoSetsPart2(encuentro.getFecha(), encuentro.getnEncuentro(), encuentro.getResultado().getSetsParticipante2(), competencia.getNombre());
		}
		
		
	}
	
	
	
	private boolean isUltimoEncuentro(Competencia competencia) {
		
		int noJugado=0;
		
		for(int i=0; i<competencia.getFixture().getEncuentros().size();i++){
			if(competencia.getFixture().getEncuentros().get(i).getJugado().equals("0")){
				noJugado+=1;
				}	
			}
		if(noJugado==1){
			return true;
		}
		else{
			return false;
		}
	}

	public void setAsistenciaParticipantes(String id_competencia, Encuentro encuentro) {

		DAO_Competencia.getInstance().setearAsistenciaParticipantes(encuentro.getnEncuentro(), encuentro.getFecha(), encuentro.getAsistioPart1(), encuentro.getAsistioPart2(), id_competencia);
	}
	
	
	
	
	
	
	
	
}
